﻿using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JGSY.Tasks
{
    public static class Parallel1
    {
        public static void Parallel001()
        {
            // 示例1: Parallel.For 并行计算数组平方
            int[] data = Enumerable.Range(1, 10).ToArray();
            Parallel.For(0, data.Length, i =>
            {
                data[i] = data[i] * data[i]; // 线程安全操作（每个元素独立）
            });
            Console.WriteLine($"平方结果: {string.Join(",", data)}");

            // 示例2: Parallel.ForEach + 线程安全集合
            var results = new ConcurrentBag<int>();
            Parallel.ForEach(Enumerable.Range(1, 100), num =>
            {
                results.Add(num * 2); // 使用线程安全集合
            });
            Console.WriteLine($"双倍结果数量: {results.Count}");

            // 示例3: Parallel.Invoke 并行执行多个操作
            Parallel.Invoke(
                () => HeavyCalculation(1),
                () => HeavyCalculation(2),
                () => HeavyCalculation(3)
            );

            // 示例4: 使用 ParallelOptions 控制并行度
            var options = new ParallelOptions
            {
                MaxDegreeOfParallelism = 2, // 最大并行线程数
                CancellationToken = new CancellationTokenSource(2000).Token // 2秒后取消
            };

            try
            {
                Parallel.ForEach(Enumerable.Range(1, 10), options, num =>
                {
                    options.CancellationToken.ThrowIfCancellationRequested();
                    Console.WriteLine($"处理数字 {num}，线程ID: {Thread.CurrentThread.ManagedThreadId}");
                    Thread.Sleep(500); // 模拟耗时操作
                });
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("操作被取消！");
            }
            catch (AggregateException ae)
            {
                Console.WriteLine($"发现异常: {ae.Flatten().InnerExceptions[0].Message}");
            }
        }

        static void HeavyCalculation(int taskId)
        {
            Console.WriteLine($"任务 {taskId} 开始，线程ID: {Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(1000); // 模拟耗时操作
            Console.WriteLine($"任务 {taskId} 完成");
        }
    }
}
